package com.totoro.project ;

import java.io.BufferedInputStream ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.util.HashMap ;
import java.util.Map ;
import java.util.Properties ;

import com.totoro.project.analysis.AnalysisContext ;

/**
 * 获取配置文件主类，单例模式，在构造的时候用户能自由配置环境变量和文件名
 * 
 * @author 80002165
 * @date 2017年2月22日 下午2:49:56
 */
public class Configuration {
    private final static String DEF_PATH_NAME = "CONF_SEPARATION_PATH" ;
    private final static String DEF_FILE_NAME = "system.properties" ;
    private static Map<String, String> propertiesMap ;
    private volatile static Configuration instance = null ;
    
    private Configuration() {
    } ;
    /**
     * 配置环境变量名以及文件名，获取配置对象。
     * @author 80002165
     * @date 2017年2月22日 下午5:03:58
     * @param environmentPathName
     * @param fileName
     * @return
     */
    public static Configuration init(String environmentPathName, String fileName) {
        try {
            synchronized (Configuration.class) {
                if (instance == null) {
                    File file = checkEnviromentFile(environmentPathName, fileName) ;
                    InputStream is = getEnvironmentFileInputStream(file) ;
                    AnalysisContext context = new AnalysisContext(fileName) ;
//                    getEnvironmentProperteis(is);
                    propertiesMap = context.getEnvironmentKV(is) ;
                    instance = new Configuration() ;
                }
            }
        } catch (Exception  e) {
            e.printStackTrace() ;
        }
        return instance ;
    }
    
    public static Configuration init() {
        return init(null, null) ;
    }
    
    /**
     * 检查配置文件是否存在
     * 
     * @author 80002165
     * @date 2017年2月22日 下午2:57:28
     * @return 返回配置文件的绝对路径
     * @throws Exception
     */
    private static File checkEnviromentFile(String pathName, String fileName) throws Exception {
        if (pathName == null)
            pathName = DEF_PATH_NAME ;
        if (fileName == null)
            fileName = DEF_FILE_NAME ;
        String path = System.getenv().get(pathName) ;
        if (path == null)
            throw new IllegalArgumentException("没有发现配置文件的环境变量" + pathName + "，请先配置环境变量！") ;
        File environmentFile = new File(pathName, fileName) ;
        if (!environmentFile.exists()) {
            throw new FileNotFoundException("配置路径:" + environmentFile.getAbsolutePath() + "下文件不存在！") ;
        }
        if (!environmentFile.isFile()) {
            throw new Exception("配置路径:" + environmentFile.getAbsolutePath() + "下不是一个文件！") ;
        }
        return environmentFile ;
    }
    
    /**
     * 获取配置文件流
     * 
     * @author 80002165
     * @date 2017年2月22日 下午3:08:10
     * @param pathName
     * @throws FileNotFoundException
     */
    private static InputStream getEnvironmentFileInputStream(File configurationFile) throws FileNotFoundException {
        InputStream is ;
        try {
            is = new BufferedInputStream(new FileInputStream(configurationFile)) ;
        } catch (FileNotFoundException e) {
            throw new FileNotFoundException("没有找到路径" + configurationFile.getAbsolutePath() + "下的配置文件") ;
        }
        return is ;
    }
    
    public static String getEnvironmentVal(String key) {
        return propertiesMap.get(key) ;
    }
    
    public static int getIntEnvironmentVal(String key) {
        return Integer.parseInt(getEnvironmentVal(key)) ;
    }
    
    public static long getLongEnviromentVal(String key) {
        return Long.parseLong(getEnvironmentVal(key)) ;
    }
    
    public static boolean getBooleanEnvironmentVal(String key) {
        return Boolean.parseBoolean(getEnvironmentVal(key)) ;
    }
}
